// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// 由addchain生成的代码。不要编辑。

package fiat

// 反转设置e=1/x，并返回e。
// 
// 如果x=0，则反转返回e=0。
func (e *P384Element) Invert(x *P384Element) *P384Element {
	// 反转是以指数p的幂运算实现的− 2.
	// 15次乘法和383次平方运算的序列源自于使用github生成的
	// 以下加法链。com/mmcloughlin/addchain v0。3.0. （10）
	// x31=2*x30+1 
	// x32=x32<<31+x31 
	// x126=x63<63+x63 
	// x252=x126<126+x126 
	// x255=x252<3+111 
	// 
	// 

	var z = new(P384Element).Set(e)
	var t0 = new(P384Element)
	var t1 = new(P384Element)
	var t2 = new(P384Element)
	var t3 = new(P384Element)

	z.Square(x)
	z.Mul(x, z)
	z.Square(z)
	t1.Mul(x, z)
	z.Square(t1)
	for s := 1; s < 3; s++ {
		z.Square(z)
	}
	z.Mul(t1, z)
	t0.Square(z)
	for s := 1; s < 6; s++ {
		t0.Square(t0)
	}
	t0.Mul(z, t0)
	t2.Square(t0)
	for s := 1; s < 12; s++ {
		t2.Square(t2)
	}
	t0.Mul(t0, t2)
	for s := 0; s < 6; s++ {
		t0.Square(t0)
	}
	z.Mul(z, t0)
	t0.Square(z)
	t2.Mul(x, t0)
	t0.Square(t2)
	t0.Mul(x, t0)
	t3.Square(t0)
	for s := 1; s < 31; s++ {
		t3.Square(t3)
	}
	t2.Mul(t2, t3)
	t3.Square(t2)
	for s := 1; s < 63; s++ {
		t3.Square(t3)
	}
	t2.Mul(t2, t3)
	t3.Square(t2)
	for s := 1; s < 126; s++ {
		t3.Square(t3)
	}
	t2.Mul(t2, t3)
	for s := 0; s < 3; s++ {
		t2.Square(t2)
	}
	t1.Mul(t1, t2)
	for s := 0; s < 33; s++ {
		t1.Square(t1)
	}
	t0.Mul(t0, t1)
	for s := 0; s < 94; s++ {
		t0.Square(t0)
	}
	z.Mul(z, t0)
	for s := 0; s < 2; s++ {
		z.Square(z)
	}
	z.Mul(x, z)

	return e.Set(z)
}
